Completed
Push — master ( 87deee...af9e24 )
by Andres
41s
created

angular.controller(ꞌct_fusionꞌ)   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 226

Duplication

Lines 0
Ratio 0 %

Importance

Changes 7
Bugs 0 Features 0
Metric Value
cc 1
c 7
b 0
f 0
nc 1
dl 0
loc 226
rs 8.2857
nop 6

18 Functions

Rating   Name   Duplication   Size   Complexity  
A ��) 0 13 1
A ��) 0 14 2
A ��) 0 5 1
A ��) 0 11 2
A ��) 0 12 1
A ��) 0 5 1
A ��) 0 14 3
A ��) 0 8 1
A ��) 0 6 1
B ��) 0 18 7
A ��) 0 7 1
A ��) 0 5 1
A ��) 0 5 1
B ��) 0 37 5
A ��) 0 13 1
A ��) 0 11 1
A ��) 0 7 1
A ��) 0 7 1

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
/**
2
 fusion
3
 Component that handles the fusion of isotopes to create new ones.
4
5
 @namespace Components
6
 */
7
'use strict';
8
9
angular.module('game').component('fusion', {
10
  templateUrl: 'views/fusion.html',
11
  controller:  'ct_fusion',
12
  controllerAs: 'ct'
13
});
14
15
angular.module('game').controller('ct_fusion', ['state', 'format', 'visibility', 'data', 'util', 'reaction',
16
  function (state, format, visibility, data, util, reactionService) {
17
    let ct = this;
18
    ct.state = state;
19
    ct.data = data;
20
    ct.util = util;
21
    ct.format = format;
22
    ct.adjustAmount = [1, 10, 25, 100];
23
24
    ct.getReactorArea = function(player) {
25
      let level = player.global_upgrades_current.fusion_area;
26
      let upgrade = data.global_upgrades.fusion_area;
27
      let basePower = upgrade.power;
28
      let exp = upgrade.power_exp;
29
      return basePower * Math.pow(exp, level);
30
    };
31
32
    ct.getBandwidth = function(player){
33
        let level = player.global_upgrades.fusion_bandwidth;
34
        let upgrade = data.global_upgrades.fusion_bandwidth;
35
        let basePower = upgrade.power;
36
        let exp = upgrade.power_exp;
37
        return basePower * Math.pow(exp, level);
38
    };
39
40
    function getFermiRadius(resource) {
41
      let isotope = data.resources[resource];
42
      let A = isotope.energy/data.constants.U_TO_EV;
43
      return data.constants.FERMI_RADIUS * Math.pow(A, 0.3333);
44
    }
45
46
    function getZ(resource){
47
      let isotope = data.resources[resource];
48
      let element = Object.keys(isotope.elements)[0];
49
      return data.elements[element].number;
50
    }
51
52
    ct.getCapacity = function(resource, player) {
53
      let isotope = data.resources[resource];
54
      let element = Object.keys(isotope.elements)[0];
55
      let r = data.elements[element].van_der_waals;
56
      let area = Math.PI*r*r;
57
      return ct.getReactorArea(player)/area;
58
    };
59
60
    ct.getTime = function(player) {
61
      let time = ct.getFusionReaction(player).reactant.eV/ct.getBandwidth(player);
62
      time = Math.floor(time);
63
      return Math.max(1, time);
64
    };
65
66
    ct.getProductIsotope = function(beam, target) {
67
      let beamN = parseInt(beam, 10);
68
      let targetN = parseInt(target, 10);
69
70
      let beamZ = getZ(beam);
71
      let targetZ = getZ(target);
72
73
      let productN = beamN+targetN;
74
      let productZ = beamZ+targetZ;
75
76
      return data.resource_matrix[productZ][productN];
77
    };
78
79
    ct.getProductEnergy = function(beam, target) {
80
      let product = ct.getProductIsotope(beam, target);
81
      if(!product){
82
        return 0;
83
      }
84
      let beamBE = data.resources[beam].binding_energy;
85
      let targetBE = data.resources[target].binding_energy;
86
      let productBE = data.resources[product].binding_energy;
87
88
      return productBE - (beamBE + targetBE);
89
    };
90
91
    ct.getCoulombBarrier = function(beam, target) {
92
      let beamZ = getZ(beam);
93
      let beamR = getFermiRadius(beam);
94
95
      let targetZ = getZ(target);
96
      let targetR = getFermiRadius(target);
97
98
      let coulombBarrier = data.constants.COULOMB_CONSTANT*beamZ*targetZ*
99
              Math.pow(data.constants.ELECTRON_CHARGE, 2)/(beamR+targetR);
100
      return coulombBarrier * data.constants.JOULE_TO_EV;
101
    };
102
103
    ct.getYieldPercent = function(player) {
104
      let beam = state.player.fusion[0].beam;
105
      let target = state.player.fusion[0].target;
106
      let beamR = getFermiRadius(beam.name);
107
      let targetR = getFermiRadius(target.name);
108
      let beamArea = Math.PI*beamR*beamR;
109
      let targetArea = Math.PI*targetR*targetR;
110
111
      let beamPercentArea = beamArea*beam.number/ct.getReactorArea(player);
112
      let targetPercentArea = targetArea*target.number/ct.getReactorArea(player);
113
114
      return beamPercentArea*targetPercentArea;
115
    };
116
117
    ct.getYield = function(player){
118
      let percentYield = ct.getYieldPercent(player);
119
      let target = state.player.fusion[0].target.number;
120
      let beam = state.player.fusion[0].beam.number;
121
      // the yield comes from wherever source is more abundant
122
      let impacted = Math.max(target, beam);
123
      return Math.floor(percentYield*impacted);
124
    };
125
126
    ct.getFusionReaction = function(player) {
127
      let reaction = {
128
        reactant: {},
129
        product: {}
130
      };
131
132
      let beam = state.player.fusion[0].beam;
133
      let target = state.player.fusion[0].target;
134
135
      reaction.reactant[beam.name] = beam.number;
136
      reaction.reactant[target.name] = target.number;
137
138
      let coulombBarrier = ct.getCoulombBarrier(beam.name, target.name);
139
      reaction.reactant.eV = coulombBarrier*beam.number;
140
141
      let product = ct.getProductIsotope(beam.name, target.name);
142
      let numberYield = ct.getYield(player);
143
144
      reaction.product[product] = numberYield;
145
146
      // return the leftovers from the reaction
147
      if(numberYield < beam.number){
148
        reaction.product[beam.name] = beam.number - numberYield;
149
      }
150
      if(numberYield < target.number){
151
        reaction.product[target.name] = target.number - numberYield;
152
      }
153
154
      let energyExchange = ct.getProductEnergy(beam.name, target.name);
155
      if(energyExchange < 0){
156
        reaction.reactant.eV += energyExchange*numberYield;
157
      }else if(energyExchange > 0){
158
        reaction.product.eV = energyExchange*numberYield;
159
      }
160
161
      return reaction;
162
    };
163
164
    function activateFusion(player){
165
      let beam = player.fusion[0].beam;
166
      let target = player.fusion[0].target;
167
168
      if(player.resources[beam.name].number < beam.number ||
169
        player.resources[target.name].number < target.number){
170
        player.fusion[0].running = false;
171
        return;
172
      }
173
      player.resources[beam.name].number -= beam.number;
174
      player.resources[target.name].number -= target.number;
175
176
      player.fusion[0].running = true;
177
    }
178
179
    ct.stopFusion = function(player, fusion) {
180
      if(fusion.running){
181
        let beam = state.player.fusion[0].beam;
182
        let target = state.player.fusion[0].target;
183
184
        player.resources[beam.name].number += fusion.beam.number;
185
        player.resources[target.name].number += fusion.target.number;
186
      }
187
188
      fusion.eV = 0;
189
      fusion.active = false;
190
      fusion.running = false;
191
      fusion.run = false;
192
    };
193
194
    function updateFusion(player, fusion) {
195
        let bandwidth = ct.getBandwidth(player);
196
        let spent = Math.min(player.resources.eV.number, bandwidth);
197
        fusion.eV += spent;
198
        player.resources.eV.number -= spent;
199
    }
200
201
    function endFusion(player, fusion, reaction) {
202
      // energy is not lost! if there are leftovers, give them back to the player
203
      let leftover = fusion.eV - reaction.reactant.eV;
204
      reaction.product.eV = reaction.product.eV + leftover || leftover;
205
      // Reaction checks that the player has the quantity necessary
206
      // to react, but here eV is stored in the fusion object. By setting the cost to 0
207
      // we make sure that it always work
208
      reaction.reactant= {eV:0};
209
      reactionService.react(1, reaction, player);
210
211
      fusion.eV = 0;
212
      player.fusion[0].running = false;
213
    }
214
215
    function update(player){
216
      for(let fusion of player.fusion){
217
        if(!fusion.active){
218
          continue;
219
        }
220
        if(fusion.eV === 0 && fusion.run){
221
          activateFusion(player);
222
        }
223
        if(!fusion.running){
224
          continue;
225
        }
226
        updateFusion(player, fusion);
227
        let reaction = ct.getFusionReaction(player);
228
        if(fusion.eV >= reaction.reactant.eV){
229
          endFusion(player, fusion, reaction);
230
        }
231
      }
232
    }
233
234
    ct.adjustLevel = function(player, upgrade, amount){
235
      player.global_upgrades_current[upgrade] += amount;
236
      // We cap it between 1 and the current max level
237
      player.global_upgrades_current[upgrade] = Math.max(1, Math.min(player.global_upgrades_current[upgrade], player.global_upgrades[upgrade]));
238
    };
239
    
240
    state.registerUpdate('fusion', update);
241
  }
242
]);
243